package com.szsh.aiot.hsm.utils.password;


import com.szsh.aiot.hsm.utils.AES;
import org.springframework.util.DigestUtils;

public class PasswordTool {




    /**
     * 评估密码的安全强度
     * 
     * @param password
     * @return 密码强度的等级值，整数值 1：强 2：中 3：弱
     */
    public static int evaluatePwdLevel (String password) {
        String p1 = "^(?![a-z0-9\\W]+$)(?![A-Za-z\\W]+$)(?![A-Z0-9\\W]+$)[a-zA-Z0-9]+$";// 强：大小写+数字
        String p2 = "^(?![0-9\\W]+$)(?![A-Z\\W]+$)[A-Z0-9]+$"; // 中：数字+大写
        String p3 = "^(?![a-z\\W]+$)(?![A-Z\\W]+$)[a-zA-Z]+$"; // 中： 大小写
        String p4 = "^(?![0-9\\W]+$)(?![a-z\\W]+$)[a-z0-9]+$";// 中：数字+小写
        String p5 = "^[a-z]+$";// 弱：小写
        String p6 = "^[0-9]+$";// 弱：数字
        String p7 = "^[A-Z]+$";// 弱：大写
        if (password.matches(p1)) {
            return 1;
        }
        if (password.matches(p2) || password.matches(p3) || password.matches(p4)) {
            return 2;
        }
        if (password.matches(p5) || password.matches(p6) || password.matches(p7)) {
            return 3;
        }
        return 1;
    }



    /**
     * 根据密钥key，解密密文
     *
     * @param cipher 加密后的内容文本
     * @param key 密钥
     * @return 解密后的文本
     * @throws RuntimeException 如果解密失败，会抛出此异常
     */
    public static String getPlaintext(String cipher, String key) {
        try {

            String keyMd5 = encryptPassword(key).toUpperCase();
            AES aes = new AES(keyMd5.getBytes(), "AES/ECB/PKCS5Padding");
            return new String(aes.decrypt(sHex2byte(cipher)));
        } catch (Exception e) {
            throw  new RuntimeException("密码解密失败", e);
        }
    }

    /**
     * 根据密钥key，解密密文，并且对解密后的明文密码评估安全强度
     *
     * @param cipher 加密后的内容文本
     * @param key 密钥
     * @return 密码强度评估结果，整数值 1：强 2：中 3：弱
     * @throws RuntimeException 如果解密失败，会抛出此异常
     */
    public static int decryptPwdAndEvaluateStrength(String cipher, String key) {
        String plainPwd = getPlaintext(cipher, key);
        return evaluatePwdLevel(plainPwd);
    }

    /**
     * MD5加密
     * @param plaintext
     * @return
     */
    public static String encryptPassword(String plaintext) {
        try {
            return  DigestUtils.md5DigestAsHex((plaintext).getBytes());
        } catch (RuntimeException var3) {
            throw new RuntimeException(var3);
        }
    }

    public static byte[] sHex2byte(String sHex) {
        int srcLen = sHex.length() / 2;
        byte[] bHex = new byte[srcLen];
        int loc = 0;
        String temp = null;

        for(int i = 0; i < srcLen; ++i) {
            temp = String.valueOf(sHex.charAt(i * 2)) + sHex.charAt(i * 2 + 1);
            bHex[loc++] = (byte)Integer.parseInt(temp, 16);
        }
        return bHex;
    }
}
